#
# Created: 2025-08-06

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
'''
友友们，这幅图建议使用python3.10及以上绘制，3.9及以下会报错
'''

plt.rcParams['font.family'] = 'Times New Roman'

# 设置Seaborn的样式，包括白色背景和隐藏坐标轴背景
sns.set_theme(style="white",rc={"axes.facecolor":(0,0,0,0)})

# 获取数据
temp=pd.read_csv('Weather_data.csv')
# 将日期列转换为月份，并存储在一个单独的 'month' 列中
temp['month']=pd.to_datetime(temp['Date']).dt.month

# 定义一个字典，将月份数字映射到对应的月份名称
month_dict={1:'January',2:'February',3:'March',4:'April',
              5:'May',6:'June',7:'July',8:'August',
              9:'September',10:'October',11:'November',12:'December'}

# 使用字典映射月份数字到月份名称，创建一个新的 'month' 列
temp['month']=temp['month'].map(month_dict)

# 生成一个包含每月平均温度的Series（用于图中的颜色），并创建一个新列
month_mean_serie=temp.groupby('month')['Mean_TemperatureC'].mean()
temp['mean_month']=temp['month'].map(month_mean_serie)

# 生成一个调色板，用于在图中表示不同月份
pal=sns.color_palette(palette='Spectral',n_colors=12)

# 创建一个FacetGrid对象，将数据按月份分组，并以月份为行，使用颜色表示平均温度
g=sns.FacetGrid(temp,row='month',hue='mean_month',aspect=15,
                  height=0.75,palette=pal)

# 添加每个月的密度估计KDE图
g.map(sns.kdeplot,'Mean_TemperatureC',bw_adjust=1,clip_on=False,
      fill=True,alpha=1,linewidth=1.5)

# 添加表示每个KDE图轮廓的白色线
g.map(sns.kdeplot,'Mean_TemperatureC',
      bw_adjust=1,clip_on=False,color="w",lw=2)

g.map(plt.axhline,y=0,lw=2,clip_on=False)		# 添加每个子图的水平线

# 在每个子图中添加文本，表示对应的月份，文本颜色与KDE图的颜色相匹配
for i,ax in enumerate(g.axes.flat):
    ax.text(-15,0.02,month_dict[i+1],
            fontweight='bold',fontsize=15,
            color=ax.lines[-1].get_color())
g.fig.subplots_adjust(hspace=-0.3)		# 使用matplotlib调整子图之间的间距

# 移除子图的标题、y轴刻度和脊柱
g.set_titles("")
g.set(yticks=[],ylabel="")					# 不显示y轴刻度和标签
g.despine(bottom=True,left=True)

# 设置x轴标签的字体大小和粗细
plt.setp(ax.get_xticklabels(),fontsize=15,fontweight='bold')
ax.set_xticklabels([f"{int(x)}°C"for x in ax.get_xticks()])
plt.xlabel('Temperature in degree Celsius',fontweight='bold',fontsize=15)

# 设置图的标题
g.fig.suptitle('Temperature Ridge',ha='center',fontsize=20,fontweight=20)
# 保存图像
plt.savefig('脊线图.png', dpi=300, bbox_inches='tight')
plt.show()
